﻿
using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.СправочникиОбъект;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиОбъект
{
	///<summary>
	///Доверенности налогоплательщика на представителя
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class ДоверенностиНалогоплательщика:СправочникОбъект
	{
		public bool _ЭтоНовый;
		public bool ЭтоНовый()
		{
			return _ЭтоНовый;
		}
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		[DataMember]
		[ProtoMember(3)]
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		[DataMember]
		[ProtoMember(4)]
		public bool ПометкаУдаления {get;set;}
		[DataMember]
		[ProtoMember(5)]
		public bool Предопределенный {get;set;}
		[DataMember]
		[ProtoMember(6)]
		public Guid Владелец {get;set;}
		[DataMember]
		[ProtoMember(7)]
		public string/*9*/ Код {get;set;}
		[DataMember]
		[ProtoMember(8)]
		public string/*100*/ Наименование {get;set;}
		[DataMember]
		[ProtoMember(9)]
		public string/*(50)*/ НомерДовер {get;set;}//Номер доверенности
		///<summary>
		///Дата выдачи доверенности
		///</summary>
		[DataMember]
		[ProtoMember(10)]
		public DateTime ДатаВыдачи {get;set;}//Дата выдачи
		///<summary>
		///Дата окончания действия доверенности
		///</summary>
		[DataMember]
		[ProtoMember(11)]
		public DateTime ДатаОкончания {get;set;}//Дата окончания
		[DataMember]
		[ProtoMember(12)]
		public decimal/*(1)*/ ПризнакДоверителя {get;set;}//Признак доверителя
		[DataMember]
		[ProtoMember(13)]
		public string/*(1000)*/ ДоверительЮЛ_НаимОрг {get;set;}//Наименование организации
		[DataMember]
		[ProtoMember(14)]
		public string/*(10)*/ ДоверительЮЛ_ИНН {get;set;}//ИНН
		[DataMember]
		[ProtoMember(15)]
		public string/*(9)*/ ДоверительЮЛ_КПП {get;set;}//КПП
		[DataMember]
		[ProtoMember(16)]
		public string/*(13)*/ ДоверительЮЛ_ОГРН {get;set;}//ОГРН
		///<summary>
		///ИНН руководителя доверителя
		///</summary>
		[DataMember]
		[ProtoMember(17)]
		public string/*(12)*/ ДоверительРук_ИНН {get;set;}//ИНН руководителя доверителя
		[DataMember]
		[ProtoMember(18)]
		public string/*(12)*/ ДоверительФЛ_ИНН {get;set;}//ИНН
		[DataMember]
		[ProtoMember(19)]
		public string/*(15)*/ ДоверительФЛ_ОГРН {get;set;}//ОГРН
		[DataMember]
		[ProtoMember(20)]
		public V82.СправочникиСсылка.КлассификаторСтранМира ДоверительФЛ_Гражданство {get;set;}//Гражданство
		[DataMember]
		[ProtoMember(21)]
		public DateTime ДоверительФЛ_ДатаРождения {get;set;}//ДатаРождения
		[DataMember]
		[ProtoMember(22)]
		public string/*(1000)*/ ПредставительЮЛ_НаимОрг {get;set;}//Наименование организации
		[DataMember]
		[ProtoMember(23)]
		public string/*(10)*/ ПредставительЮЛ_ИНН {get;set;}//ИНН
		[DataMember]
		[ProtoMember(24)]
		public string/*(9)*/ ПредставительЮЛ_КПП {get;set;}//КПП
		[DataMember]
		[ProtoMember(25)]
		public string/*(13)*/ ПредставительЮЛ_ОГРН {get;set;}//ОГРН
		[DataMember]
		[ProtoMember(26)]
		public string/*(12)*/ ПредставительФЛ_ИНН {get;set;}//ИНН
		[DataMember]
		[ProtoMember(27)]
		public string/*(15)*/ ПредставительФЛ_ОГРН {get;set;}//ОГРН
		[DataMember]
		[ProtoMember(28)]
		public V82.СправочникиСсылка.КлассификаторСтранМира ПредставительФЛ_Гражданство {get;set;}//Гражданство
		[DataMember]
		[ProtoMember(29)]
		public DateTime ПредставительФЛ_ДатаРождения {get;set;}//ДатаРождения
		[DataMember]
		[ProtoMember(30)]
		public string/*(1000)*/ НотариусЮЛ_НаимОрг {get;set;}//Наименование организации
		[DataMember]
		[ProtoMember(31)]
		public string/*(10)*/ НотариусЮЛ_ИНН {get;set;}//ИНН
		[DataMember]
		[ProtoMember(32)]
		public string/*(9)*/ НотариусЮЛ_КПП {get;set;}//КПП
		[DataMember]
		[ProtoMember(33)]
		public string/*(13)*/ НотариусЮЛ_ОГРН {get;set;}//ОГРН
		[DataMember]
		[ProtoMember(34)]
		public string/*(12)*/ НотариусФЛ_ИНН {get;set;}//ИНН
		[DataMember]
		[ProtoMember(35)]
		public bool ДоверительЯвляетсяЮЛ {get;set;}//Доверитель является ЮЛ
		[DataMember]
		[ProtoMember(36)]
		public bool ПредставительЯвляетсяЮЛ {get;set;}//Представитель является ЮЛ
		[DataMember]
		[ProtoMember(37)]
		public bool НотариусЯвляетсяЮЛ {get;set;}//Нотариус является ЮЛ
		[DataMember]
		[ProtoMember(38)]
		public bool ЗаверенаНотариально {get;set;}//Заверена нотариально
		///<summary>
		///наличие уполномоченного лица у доверителя - юл
		///</summary>
		[DataMember]
		[ProtoMember(39)]
		public bool ДоверительИмеетУЛ {get;set;}//Доверитель имеет УЛ
		[DataMember]
		[ProtoMember(40)]
		public bool ПредставительЯвляетсяСотрудником {get;set;}//Представитель является сотрудником
		public void Записать()
		{
			//Установка блокировки элемента на горизантально масштабированный кластер.
			//Опционально введение тайм аута на запись одного и того же объекта, не чаще раза в 5-секунд. Защита от спама. упращение алгоритма блокировки.
			//Выделение сервиса для блокировки элемента и генерации кода
			//Выполнение операций контроля без обращений к sql-серверу.
			//Контроль конфликта блокировок.
			//Контроль загрузки булкинсертом гетерогенной коллекции.
			//Контроль уникальности кода для справочников.
			//Контроль уникальности номера для документов, в границах префикса.
			//Контроль владельца, он не может быть группой.
			//Контроль владельца он должен быть задан.
			//Контроль родителя он должен быть группой.
			//Контроль количества уровней, должен соотвествовать метаданным.
			//Контроль версии, объект не должен был быть записан перед чтением текущей записи, алгоритм версионника.
			//Контроль уникальности ссылки
			//Контроль зацикливания
			//Опционально контроль битых ссылок.
			//Соблюдейние транзакционности. ПередЗаписью. Открытие транзации. Валидации. ПриЗаписи. Фиксация транзакции. Информирование о записи элемента.
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					if(_ЭтоНовый)
					{
						Команда.CommandText = @"
						Insert Into _Reference23095(
						_IDRRef
						/*,_Version*/
						,_Marked
						,_IsMetadata
						,_OwnerIDRRef
						,_Code
						,_Description
						,_Fld23393
						,_Fld23394
						,_Fld23395
						,_Fld23396
						,_Fld23397
						,_Fld23398
						,_Fld23399
						,_Fld23400
						,_Fld23401
						,_Fld23402
						,_Fld23403
						,_Fld23404RRef
						,_Fld23405
						,_Fld23406
						,_Fld23407
						,_Fld23408
						,_Fld23409
						,_Fld23410
						,_Fld23411
						,_Fld23412RRef
						,_Fld23413
						,_Fld23414
						,_Fld23415
						,_Fld23416
						,_Fld23417
						,_Fld23418
						,_Fld23419
						,_Fld23420
						,_Fld23421
						,_Fld23422
						,_Fld23423
						,_Fld23424)
						Values(
						@Ссылка
						/*,@Версия*/
						,@ПометкаУдаления
						,@Предопределенный
						,@Владелец
						,@Код
						,@Наименование
						,@НомерДовер
						,@ДатаВыдачи
						,@ДатаОкончания
						,@ПризнакДоверителя
						,@ДоверительЮЛ_НаимОрг
						,@ДоверительЮЛ_ИНН
						,@ДоверительЮЛ_КПП
						,@ДоверительЮЛ_ОГРН
						,@ДоверительРук_ИНН
						,@ДоверительФЛ_ИНН
						,@ДоверительФЛ_ОГРН
						,@ДоверительФЛ_Гражданство
						,@ДоверительФЛ_ДатаРождения
						,@ПредставительЮЛ_НаимОрг
						,@ПредставительЮЛ_ИНН
						,@ПредставительЮЛ_КПП
						,@ПредставительЮЛ_ОГРН
						,@ПредставительФЛ_ИНН
						,@ПредставительФЛ_ОГРН
						,@ПредставительФЛ_Гражданство
						,@ПредставительФЛ_ДатаРождения
						,@НотариусЮЛ_НаимОрг
						,@НотариусЮЛ_ИНН
						,@НотариусЮЛ_КПП
						,@НотариусЮЛ_ОГРН
						,@НотариусФЛ_ИНН
						,@ДоверительЯвляетсяЮЛ
						,@ПредставительЯвляетсяЮЛ
						,@НотариусЯвляетсяЮЛ
						,@ЗаверенаНотариально
						,@ДоверительИмеетУЛ
						,@ПредставительЯвляетсяСотрудником)";
					}
					else
					{
						Команда.CommandText = @"
						Update _Reference23095
						Set
						/*_IDRRef	= @Ссылка*/
						/*,_Version	= @Версия*/
						_Marked	= @ПометкаУдаления
						,_IsMetadata	= @Предопределенный
						,_OwnerIDRRef	= @Владелец
						,_Code	= @Код
						,_Description	= @Наименование
						,_Fld23393	= @НомерДовер
						,_Fld23394	= @ДатаВыдачи
						,_Fld23395	= @ДатаОкончания
						,_Fld23396	= @ПризнакДоверителя
						,_Fld23397	= @ДоверительЮЛ_НаимОрг
						,_Fld23398	= @ДоверительЮЛ_ИНН
						,_Fld23399	= @ДоверительЮЛ_КПП
						,_Fld23400	= @ДоверительЮЛ_ОГРН
						,_Fld23401	= @ДоверительРук_ИНН
						,_Fld23402	= @ДоверительФЛ_ИНН
						,_Fld23403	= @ДоверительФЛ_ОГРН
						,_Fld23404RRef	= @ДоверительФЛ_Гражданство
						,_Fld23405	= @ДоверительФЛ_ДатаРождения
						,_Fld23406	= @ПредставительЮЛ_НаимОрг
						,_Fld23407	= @ПредставительЮЛ_ИНН
						,_Fld23408	= @ПредставительЮЛ_КПП
						,_Fld23409	= @ПредставительЮЛ_ОГРН
						,_Fld23410	= @ПредставительФЛ_ИНН
						,_Fld23411	= @ПредставительФЛ_ОГРН
						,_Fld23412RRef	= @ПредставительФЛ_Гражданство
						,_Fld23413	= @ПредставительФЛ_ДатаРождения
						,_Fld23414	= @НотариусЮЛ_НаимОрг
						,_Fld23415	= @НотариусЮЛ_ИНН
						,_Fld23416	= @НотариусЮЛ_КПП
						,_Fld23417	= @НотариусЮЛ_ОГРН
						,_Fld23418	= @НотариусФЛ_ИНН
						,_Fld23419	= @ДоверительЯвляетсяЮЛ
						,_Fld23420	= @ПредставительЯвляетсяЮЛ
						,_Fld23421	= @НотариусЯвляетсяЮЛ
						,_Fld23422	= @ЗаверенаНотариально
						,_Fld23423	= @ДоверительИмеетУЛ
						,_Fld23424	= @ПредставительЯвляетсяСотрудником
						Where _IDRRef = @Ссылка";
					}
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					/*Команда.Parameters.AddWithValue("Версия", Версия);*/
					Команда.Parameters.AddWithValue("ПометкаУдаления", ПометкаУдаления);
					Команда.Parameters.AddWithValue("Предопределенный", Предопределенный);
					Команда.Parameters.AddWithValue("Владелец", Владелец);
					Команда.Parameters.AddWithValue("Код", Код);
					Команда.Parameters.AddWithValue("Наименование", Наименование);
					Команда.Parameters.AddWithValue("НомерДовер", НомерДовер);
					Команда.Parameters.AddWithValue("ДатаВыдачи", ДатаВыдачи);
					Команда.Parameters.AddWithValue("ДатаОкончания", ДатаОкончания);
					Команда.Parameters.AddWithValue("ПризнакДоверителя", ПризнакДоверителя);
					Команда.Parameters.AddWithValue("ДоверительЮЛ_НаимОрг", ДоверительЮЛ_НаимОрг);
					Команда.Parameters.AddWithValue("ДоверительЮЛ_ИНН", ДоверительЮЛ_ИНН);
					Команда.Parameters.AddWithValue("ДоверительЮЛ_КПП", ДоверительЮЛ_КПП);
					Команда.Parameters.AddWithValue("ДоверительЮЛ_ОГРН", ДоверительЮЛ_ОГРН);
					Команда.Parameters.AddWithValue("ДоверительРук_ИНН", ДоверительРук_ИНН);
					Команда.Parameters.AddWithValue("ДоверительФЛ_ИНН", ДоверительФЛ_ИНН);
					Команда.Parameters.AddWithValue("ДоверительФЛ_ОГРН", ДоверительФЛ_ОГРН);
					Команда.Parameters.AddWithValue("ДоверительФЛ_Гражданство", ДоверительФЛ_Гражданство.Ссылка);
					Команда.Parameters.AddWithValue("ДоверительФЛ_ДатаРождения", ДоверительФЛ_ДатаРождения);
					Команда.Parameters.AddWithValue("ПредставительЮЛ_НаимОрг", ПредставительЮЛ_НаимОрг);
					Команда.Parameters.AddWithValue("ПредставительЮЛ_ИНН", ПредставительЮЛ_ИНН);
					Команда.Parameters.AddWithValue("ПредставительЮЛ_КПП", ПредставительЮЛ_КПП);
					Команда.Parameters.AddWithValue("ПредставительЮЛ_ОГРН", ПредставительЮЛ_ОГРН);
					Команда.Parameters.AddWithValue("ПредставительФЛ_ИНН", ПредставительФЛ_ИНН);
					Команда.Parameters.AddWithValue("ПредставительФЛ_ОГРН", ПредставительФЛ_ОГРН);
					Команда.Parameters.AddWithValue("ПредставительФЛ_Гражданство", ПредставительФЛ_Гражданство.Ссылка);
					Команда.Parameters.AddWithValue("ПредставительФЛ_ДатаРождения", ПредставительФЛ_ДатаРождения);
					Команда.Parameters.AddWithValue("НотариусЮЛ_НаимОрг", НотариусЮЛ_НаимОрг);
					Команда.Parameters.AddWithValue("НотариусЮЛ_ИНН", НотариусЮЛ_ИНН);
					Команда.Parameters.AddWithValue("НотариусЮЛ_КПП", НотариусЮЛ_КПП);
					Команда.Parameters.AddWithValue("НотариусЮЛ_ОГРН", НотариусЮЛ_ОГРН);
					Команда.Parameters.AddWithValue("НотариусФЛ_ИНН", НотариусФЛ_ИНН);
					Команда.Parameters.AddWithValue("ДоверительЯвляетсяЮЛ", ДоверительЯвляетсяЮЛ);
					Команда.Parameters.AddWithValue("ПредставительЯвляетсяЮЛ", ПредставительЯвляетсяЮЛ);
					Команда.Parameters.AddWithValue("НотариусЯвляетсяЮЛ", НотариусЯвляетсяЮЛ);
					Команда.Parameters.AddWithValue("ЗаверенаНотариально", ЗаверенаНотариально);
					Команда.Parameters.AddWithValue("ДоверительИмеетУЛ", ДоверительИмеетУЛ);
					Команда.Parameters.AddWithValue("ПредставительЯвляетсяСотрудником", ПредставительЯвляетсяСотрудником);
					Команда.ExecuteNonQuery();
				}
			}
		}
		public void Удалить()
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Delete _Reference23095
					Where _IDRRef=@Ссылка";
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					Команда.ExecuteNonQuery();
				}
			}
		}
		/*МодульОбъекта*/

		public void ПередЗаписью(/*Отказ*/)
		{
			if(true/*ОбменДанными.Загрузка*/)
			{
			}
			if(true/*ПометкаУдаления ИЛИ Ссылка.ПометкаУдаления*/)
			{
			}
			//Наименование = "Доверенность" + ?(ЗначениеЗаполнено(НомерДовер), " №" + НомерДовер, "") + " от " + Формат(ДатаВыдачи, "ДФ='dd.MM.yyyy ""г.""'");
			//Заголовок = "Запись доверенности налогоплательщика (" + Владелец + ") " + Наименование + ", код " + Код;
			/*// Проверка заполнения обязательных реквизитов
*/
			if(true/*НЕ ЗначениеЗаполнено(Владелец)*/)
			{
				//ОбщегоНазначения.СообщитьОбОшибке("Не выбрана организация налогоплательщика", Отказ, Заголовок);
			}
			if(true/*НЕ ЗначениеЗаполнено(ДатаВыдачи)*/)
			{
				//ОбщегоНазначения.СообщитьОбОшибке("Не указана дата выдачи доверенности", Отказ, Заголовок);
			}
			if(true/*ПолномочияПредставителя.Количество() = 0*/)
			{
				//ОбщегоНазначения.СообщитьОбОшибке("Не заполнены сведения о полномочиях представителя", Отказ, Заголовок);
			}
		}
	}
}